package com.uwlaser.socket.client;

import com.uwlaser.socket.exception.TcpSocketTimeoutException;

import java.util.concurrent.ConcurrentHashMap;

/**
 * @Author QZK
 * @Description TODO
 * @Date 2022-12-05-12:05
 * @Version 1.0
 */
public class SocketResultMap {

    /**
     * 默认超时时间
     */
    private static final long DEFAULT_TIMEOUT = 5 * 1000;

    /**
     * 结果
     */
    private static final ConcurrentHashMap<String,String> RESULT_MAP = new ConcurrentHashMap<>();

    /**
     * 设置key
     * @param key
     */
    public static void setKey(String key) {
        RESULT_MAP.put(key,"");
    }

    /**
     * 设置值
     * @param key
     */
    public static void setValue(String key, String value) {
        RESULT_MAP.put(key,value);
    }

    /**
     * 获取结果 (默认超时时间)
     * @param key
     * @return
     */
    public static String getResult(String key) throws Exception {
        return getResult(key, DEFAULT_TIMEOUT);
    }

    /**
     * 判断key是否存在
     * @param key
     * @return
     */
    public static boolean containsKey(String key){
        return RESULT_MAP.containsKey(key);
    }

    /**
     * 获取结果（自定义超时时间）
     * @param key
     * @return
     */
    public static String getResult(String key, long timeout) throws Exception {
        String result = null;
        long startTime = System.currentTimeMillis();
        //超时时间
        while (System.currentTimeMillis() - startTime < timeout) {
            result = RESULT_MAP.get(key);
            if(result != null && !result.equals("")){
                //如果获取到值直接返回，并且删除掉
                RESULT_MAP.remove(key);
                break;
            }
            try {
                Thread.sleep(10);
            }catch (Exception e) {
            }
        }
        // 如果循环走完还是没有结果，表示请求超时了
        if(result == null || result.equals("")){
            RESULT_MAP.remove(key);
            throw new TcpSocketTimeoutException("发送数据时请求超时,等待服务器响应时间【"+timeout+"】，没有接收到服务器返回结果!");
        }
        return result;
    }

}
